// 土匪替换插件（新版）

string author = "Live";
string pluginName = "CsPro 土匪替换插件（新版）";
string version = "0.3";

// 添加控制台指令设置最大数量限制
CASConVar@ inmateNum = null;
// 每人多少个
CASConVar@ inmateNumForPlayer = null;

// 定时方法
CSchedule@ creatInmateTask = null;

// 插件初始化
void OnPluginInit()
{
    // 设置插件信息
    PluginData::SetAuthor(author);
    PluginData::SetName(pluginName);
    PluginData::SetVersion(version);

    // 提示
    ThePresident.InfoFeed("插件:"+pluginName+"| 版本:"+version+"| 作者:"+author,false);
	
	// 创建指令
	@inmateNum = ConVar::Create( "live_inmateNum", "0", "NPC的限制量，0为地图默认的僵尸量", true, 0.0f, true, 80.0f );
	@inmateNumForPlayer = ConVar::Create( "live_inmateNumForPlayer", "0", "每个人分配的僵尸数量（会覆盖live_inmateNum）", true, 0.0f, true, 10.0f );
	
	// 重写僵尸生成
	Events::Infected::OverrideZombieSpawn.Hook( @OverrideZombieSpawn );
	// NPC生成
	// Events::Survivor::OnSurvivorSpawned.Hook( @OnSurvivorSpawned );
	// 玩家进入游戏后
    Events::Player::OnPlayerConnected.Hook( @OnPlayerConnected );

	// NPC受伤之前
	Events::Survivor::OnSurvivorDamagedPre.Hook( @OnSurvivorDamagedPre );
	
	// 地图开始 
    ThePresident_OnMapStart();
	
	// 检查额外NPC
	@creatInmateTask = Schedule::Create( creatInmate, 2.0f, -1 );
}

// 地图开始
void ThePresident_OnMapStart(){
	// 服务器中文名
    Engine.RunConsoleCommand( "hostname [CN.Live] 特殊 | 反恐 CS QQ群392635015");
	// 执行回合开始
    ThePresident_OnRoundStart();
}

// 回合开始
void ThePresident_OnRoundStart()
{
	
}

// 插件卸载
void OnPluginUnload()
{
	creatInmateTask.Pause();
	ConVar::Remove( inmateNum );
	ConVar::Remove( inmateNumForPlayer );
	// Chat.PrintToChat(all,"清理指令");
}

HookReturnCode OverrideZombieSpawn( string &in szZombieEnt, string &out szZombieEntOverride )
{
	// 只替换普通僵尸
	if ( szZombieEnt != "zombie" ) return HOOK_CONTINUE;
	szZombieEntOverride = "inmate";
	return HOOK_HANDLED;
}

// HookReturnCode OnSurvivorSpawned(Survivor@ pSurvivor)
// {
	// if ( pSurvivor is null ) return HOOK_CONTINUE;
	// return HOOK_HANDLED;
// }

// 额外刷方法
void creatInmate(){
	// Chat.PrintToChat(all,"运行一次");
	int live_inmateNum = inmateNum.GetInt();
	if( live_inmateNum != 0 ){
		// 获取当前的inmate的数量
		int inmate = getInmateNum();
		// 如果当前的数量少于指令量，就开刷
		if( inmate < live_inmateNum ){
			Chat.PrintToChat(all,"当前量："+inmate+",应该刷的量："+live_inmateNum);
			ThePresident.SetSpawnConstantFlags(ZSF_FORCED_AREA);
            ThePresident.SetSpawnZombiesConstant(1);
		}else{
			Chat.PrintToChat(all,"已刷满，关闭，当前量："+inmate+",应该刷的量："+live_inmateNum);
			ThePresident.SetSpawnZombiesConstant(0);
		}
	}else{
		// Chat.PrintToChat(all,"0");
	}
}

// 获取当前的inmate的数量
int getInmateNum(){
	int num = 0;
	string name = "inmate";
    CBaseEntity @pEnt = FindEntityByClassname( null, name );
    while( pEnt !is null)
    {
        num++;
        @pEnt = FindEntityByClassname( pEnt, name );
    }
	return num;
}

// 玩家进入游戏后
HookReturnCode OnPlayerConnected(CTerrorPlayer@ pPlayer)
{
	if(inmateNumForPlayer.GetInt() != 0)
		inmateNum.SetValue(""+getAllInmateNum());
    return HOOK_CONTINUE;
}

// 应该刷的量（每个inmateNumForPlayer人加起来）
int getAllInmateNum(){
	// 查询当前玩家人数
    int playerNum = Utils.CollectPlayers().length();
	// 根据玩家数设置NPC量
    int num = playerNum * inmateNumForPlayer.GetInt();
	Chat.PrintToChat(all,"常量已设置为：{gold}"+num+"(每人"+inmateNumForPlayer.GetInt()+"个,最大80)");
	if( num > 80 )
		return 80;
	else
		return num;
}

// 当NPC受伤之前
HookReturnCode OnSurvivorDamagedPre(Survivor@ pSurvivor, CTakeDamageInfo &in DamageInfo)
{
	// 看看伤害是不是致命
	if(DamageInfo.GetDamage() >= pSurvivor.GetHealth()){
		CBaseEntity@ pBaseEnt = pSurvivor.opCast();
		Engine.Ent_Fire_Ent( pBaseEnt, "BecomeRagdoll", "", "0");
	}
	return HOOK_HANDLED;
}
